// ++++++++++++++++++++++++++++++++++++++++
// 《零基础Go语言算法实战》源码
// ++++++++++++++++++++++++++++++++++++++++
// Author:廖显东（ShirDon）
// Blog:https://www.shirdon.com/
// Gitee:https://gitee.com/shirdonl/goAlgorithms.git
// Buy link :https://item.jd.com/14101229.html
// ++++++++++++++++++++++++++++++++++++++++

package main

import "fmt"

type Stack []string

// 检查栈是否为空
func (s *Stack) IsEmpty() bool {
	return len(*s) == 0
}

// 入栈方法
func (s *Stack) Push(str string) {
	//只需将新值附加到堆栈的末尾
	*s = append(*s, str)
}

// 出栈方法。如果堆栈为空，则返回 false
func (s *Stack) Pop() (string, bool) {
	if s.IsEmpty() {
		return "", false
	} else {
		// 获取最顶层元素的索引
		index := len(*s) - 1
		// 对切片进行索引并获取元素。
		element := (*s)[index]
		// 通过切片将其从堆栈中移除。
		*s = (*s)[:index]
		return element, true
	}
}
func main() {
	// 创建一个 Stack 类型的栈变量
	var stack Stack
	stack.Push("First")
	stack.Push("Second")
	stack.Push("Third")
	for len(stack) > 0 {
		x, y := stack.Pop()
		if y == true {
			fmt.Println(x)
		}
	}
}

//$ go run stack.go
//Third
//Second
//First
